home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Atari Compendium
/
The Atari Compendium (Toad Computers) (1994).iso
/
files
/
umich
/
tex
/
td187src.lzh
/
METAFONT.I
< prev
next >
Wrap
Text File
|
1991-12-14
|
32KB
|
929 lines
IMPLEMENTATION MODULE Metafont ;
(* 23/01/91 21:17 *)
(* 29/01/91 23:55 *)
(* 06/02/91 09:15 *)
FROM BezierCurve IMPORT ComputeBezier;
FROM Dialoge IMPORT BusyStart, BusyEnd;
FROM FileIO IMPORT WriteLn, Rewrite, Close;
FROM SYSTEM IMPORT ADDRESS , ADR ;
FROM Types IMPORT ObjectSet, TextPosTyp, DrawObjectTyp, ObjectPtrTyp;
IMPORT CommonData ;
IMPORT Diverses ;
IMPORT GetFile ;
IMPORT MathLib0;
IMPORT ObjectUtilities ;
IMPORT MagicStrings ;
IMPORT MagicSys ;
IMPORT Variablen ;
(**
IMPORT PDebug;
**)
(* Index 1 und 2 bezeichen immer den Referenzpunkt *)
(* Index 8 zumeist die Liniendicke, Index 9 die Textlänge so vorhanden *)
(* 0 | 3 | 4 | 5 | 6 | 7 | 8 | 9 *)
(* ---------------+--------+-------+---------------+-------+-------+------ *)
(* Picture | XExt | YExt |objekte|unitlen| | | *)
(* Text | | | | |AlignFl| |Textlen*)
(* Line | | | | | | | *)
(* Arrow | | | | | | | *)
(* Circle | Radius | | | | | | *)
(* Disk | Radius | | | | | | *)
(* Oval | Radius | Posit.| | | | | *)
(* Filledbox | XExt | XExt | | | | | *)
(* Ovalbox | XExt | YExt | | | | | *)
(* Framebox | XExt | YExt |Textpos|MBxFlag|AlignFl| |Textlen*)
(* Dashbox | XExt | Yext |Textpos| |AlignFl| |Textlen*)
(* Beziercurve | X2 | Y2 | X3 | Y3 |Points | | *)
(* Bezierellipse | X2 | Y2 | X3 | Y3 |Points | | *)
(* EpicSolidLine | Pts-1 | | | | | |MarkTL *)
(* EpicDottedLine | Pts-1 | | | | | | " *)
(* EpicDashedLine | Pts-1 | | | | | | " *)
(* EpicGrid | Xext | YExt |DeltaX |DeltaY | | | *)
CONST NUL = 0C ;
LF = 12C ;
CR = 15C ;
CNTR = 0;
LEFT = 1;
RGHT = 2;
TOP = 1;
BOT = 2;
BASE = 3;
VAR OutLine, Part,
String : ARRAY [0..255] OF CHAR ;
converted : ARRAY [0..9] OF CHAR;
Comment : ARRAY [0..1] OF CHAR;
Handle , i , j : INTEGER ;
Bool : BOOLEAN ;
LatexObs : BOOLEAN;
Object : ObjectPtrTyp ;
Width : INTEGER ; (* Liniendicke *)
maxX, maxY,
minX, minY : INTEGER;
prefaktor : INTEGER;
(**********************************************************)
(**
PROCEDURE AppendChar(c : CHAR; VAR target : ARRAY OF CHAR);
VAR temp : ARRAY [0..1] OF CHAR;
BEGIN
temp[0] := c;
temp[1] := 0C;
MagicStrings.Append(temp, target);
END AppendChar;
**)
(**********************************************************)
PROCEDURE GetNumber(num : INTEGER; VAR str : ARRAY OF CHAR);
VAR len, i : INTEGER;
nul, pt : ARRAY [0..1] OF CHAR;
BEGIN
nul := '0';
pt := '.';
Variablen.NumberToStr(num, str);
IF prefaktor >0 THEN
len := MagicStrings.Length(str);
WHILE (prefaktor>len) DO
MagicStrings.Insert(nul, str, 0);
len := MagicStrings.Length(str);
END;
MagicStrings.Insert(pt, str, len - prefaktor);
END;
END GetNumber;
(**********************************************************)
PROCEDURE WriteMetaProlog(charcode : INTEGER);
VAR unitstr : ARRAY [0..9] OF CHAR;
i : INTEGER;
BEGIN
WriteLn ( Handle, Comment ) ;
OutLine := "% "; MagicStrings.Append ( String , OutLine ); WriteLn( Handle, OutLine ) ;
WriteLn ( Handle, '% Graphic-font-file (created by TeX-Draw, JP-91)');
WriteLn ( Handle, Comment ) ;
WriteLn ( Handle, 'mode_setup;');
WriteLn ( Handle, 'font_identifier:="TeXDraw-Picture";');
WriteLn ( Handle, 'font_coding_scheme:="TeXDraw-Conversion";');
OutLine := 'unit#:=';
IF prefaktor>0 THEN
(* AppendChar('1', OutLine);*)
MagicStrings.Append('1', OutLine);
FOR i:=1 TO prefaktor DO
(* AppendChar('0', OutLine);*)
MagicStrings.Append('0', OutLine);
END;
(* AppendChar('*', OutLine);*)
MagicStrings.Append('*', OutLine);
END;
Variablen.FactorToStr(converted);
MagicStrings.Append(converted, OutLine);
MagicStrings.Append(' * ', OutLine);
Variablen.UnitToStr(unitstr);
MagicStrings.Append(unitstr, OutLine);
MagicStrings.Append('#;', OutLine);
WriteLn(Handle, OutLine);
OutLine := 'u#:=1/';
Variablen.NumberToStr(CommonData.InternalResolution, converted);
MagicStrings.Append( converted, OutLine);
MagicStrings.Append( '* unit#; % basic units', OutLine); WriteLn(Handle, OutLine);
OutLine := 'font_size ';
GetNumber(maxY - minY, converted);
MagicStrings.Append(converted, OutLine);
MagicStrings.Append(' * u#;', OutLine);
WriteLn(Handle, OutLine);
WriteLn ( Handle, Comment);
WriteLn ( Handle, "% This file contains just one graphic, so we don't need to");
WriteLn ( Handle, "% specify values for fontdimen 1..7 (at least I hope so).");
WriteLn ( Handle, Comment);
OutLine := 'symb_w# :=';
GetNumber(maxX-minX, converted);
MagicStrings.Append( converted, OutLine);
MagicStrings.Append( ' * u#;', OutLine);
WriteLn(Handle, OutLine);
OutLine := 'symb_h# :=';
GetNumber(maxY-minY, converted);
MagicStrings.Append( converted, OutLine);
MagicStrings.Append( ' * u#;', OutLine);
WriteLn(Handle, OutLine);
OutLine := 'thin_pen# := ';
i := (CommonData.MetaLThin MOD 10000) DIV 1000;
Variablen.NumberToStr(i, converted);
MagicStrings.Append( converted, OutLine);
(* AppendChar('.', OutLine);*)
MagicStrings.Append('.', OutLine);
i := CommonData.MetaLThin MOD 1000;
Variablen.NumberToStr(i, converted);
MagicStrings.Append( converted, OutLine);
IF CommonData.MetaLThin DIV 10000 > 0 THEN (* mm *)
MagicStrings.Append( 'mm', OutLine);
ELSE
MagicStrings.Append( 'pt', OutLine);
END;
MagicStrings.Append( '#; define_blacker_pixels(thin_pen);', OutLine);
WriteLn ( Handle, OutLine);
OutLine := 'thick_pen# := ';
i := (CommonData.MetaLThick MOD 10000) DIV 1000;
Variablen.NumberToStr(i, converted);
MagicStrings.Append( converted, OutLine);
(* AppendChar('.', OutLine);*)
MagicStrings.Append('.', OutLine);
i := CommonData.MetaLThick MOD 1000;
Variablen.NumberToStr(i, converted);
MagicStrings.Append( converted, OutLine);
IF CommonData.MetaLThin DIV 10000 > 0 THEN (* mm *)
MagicStrings.Append( 'mm', OutLine);
ELSE
MagicStrings.Append( 'pt', OutLine);
END;
MagicStrings.Append( '#; define_blacker_pixels(thick_pen);', OutLine);
WriteLn ( Handle, OutLine);
OutLine := 'vthick_pen# := ';
i := (CommonData.MetaLVThick MOD 10000) DIV 1000;
Variablen.NumberToStr(i, converted);
MagicStrings.Append( converted, OutLine);
(* AppendChar('.', OutLine);*)
MagicStrings.Append('.', OutLine);
i := CommonData.MetaLVThick MOD 1000;
Variablen.NumberToStr(i, converted);
MagicStrings.Append( converted, OutLine);
IF CommonData.MetaLVThick DIV 10000 > 0 THEN (* mm *)
MagicStrings.Append( 'mm', OutLine);
ELSE
MagicStrings.Append( 'pt', OutLine);
END;
MagicStrings.Append( '#; define_blacker_pixels(vthick_pen);', OutLine);
WriteLn ( Handle, OutLine);
WriteLn ( Handle, 'pickup pencircle scaled vthick_pen; vthick_nib := savepen;');
WriteLn ( Handle, 'pickup pencircle scaled thick_pen; thick_nib := savepen;');
WriteLn ( Handle, 'pickup pencircle scaled thin_pen; thin_nib := savepen;');
WriteLn ( Handle, Comment);
WriteLn ( Handle, 'define_pixels(unit, u);');
WriteLn ( Handle, Comment);
IF ObjectUtilities.ObjectExist(
ObjectSet{
EpicDottedLine,
EpicDashedLine,
Dashbox,
Arrow}) THEN
WriteLn ( Handle, "input linmacro;